﻿using System.Collections;
using System.Collections.Generic;
using System.Xml;
using UnityEngine;


public class ReadXml : MonoBehaviour
{
    // Start is called before the first frame update
    void Start()
    {
        //C#读取XML的方法有几种
        //1.XmlDocument     把数据加载到内存中，方便读取
        //2.XmlTextReader   以流形式加载，内存占用更少，但是是单向只读，使用不是特别方便，除非有特殊需求，否则不会使用
        //3.Linq            以后专门讲Linq的时候讲

        //使用XmlDocument类读取是较方便最容易理解和操作的方法
        #region 知识一 读取XML文件信息
        XmlDocument xml = new XmlDocument();
        //通过XmlDocument读取Xml文件 有两个API
        //1.是直接根据xml字符串内容 来加载xml文件
        //存放在Resources文件下的xml文件加载处理
        TextAsset asset = Resources.Load<TextAsset>("TestXml");
        Debug.LogFormat("asset.text:{0}", asset.text);
        //通过这个方法 将字符串翻译为xml对象
        xml.LoadXml(asset.text);

        //2.通过xml文件的路径去进行加载
        xml.Load(Application.streamingAssetsPath + "/TestXml.xml");
        #endregion

        #region 知识二 读取元素和属性信息
        //节点信息类
        //XmlNode 单元个节点信息类
        //节点列表信息
        //XmlNodeList 多个节点信息类

        //获取xml当中的根节点
        XmlNode root = xml.SelectSingleNode("Root");
        //再通过根节点 去获取下面的子节点
        XmlNode nodeName = root.SelectSingleNode("name");
        //如果想获取节点包裹的元素信息 直接.InnerText
        Debug.LogFormat("name={0}",nodeName.InnerText);
        XmlNode nodeAge = root.SelectSingleNode("age");
        Debug.LogFormat("age={0}", nodeAge.InnerText);

        //Item
        XmlNode nodeItem = root.SelectSingleNode("Item");
        //第一种方式
        Debug.LogFormat("Item-1 id:{0} num:{1}", nodeItem.Attributes["id"].Value, nodeItem.Attributes["num"].Value);
        //第二种方式
        Debug.LogFormat("Item-2 id:{0} num:{1}", nodeItem.Attributes.GetNamedItem("id").Value, nodeItem.Attributes.GetNamedItem("num").Value);

        //Friend
        XmlNodeList Friends = root.SelectNodes("Friend");
        //遍历方式1：迭代器遍历 
        foreach (XmlNode item in Friends)
        {
            Debug.LogFormat("Friend-1 name:{0} age:{1}", item.SelectSingleNode("name").InnerText, item.SelectSingleNode("age").InnerText);
        }
        //遍历方式2：迭代器遍历 
        for (int i=0; i<Friends.Count; i++)
        {
            Debug.LogFormat("Friend-2 name:{0} age:{1}", Friends[i].SelectSingleNode("name").InnerText, Friends[i].SelectSingleNode("age").InnerText);
        }
        #endregion

        #region 总结
        //1.读取XML文件
        //XmlDocument xml = new XmlDocument();
        //读取文本方式1-xml.LoadXml("传入xml文本字符串")
        //读取文本方式2-xml.Load(传入路径)

        //2.读取元素和属性
        //获取单个节点：XmlNode node = xml.SelectSingleNode(节点名);
        //获取多个节点：XmlNodeList nodeList = xml.SelectNodes(节点名);

        //获取节点元素内容：node.InnerText
        //获取节点元素属性：
        //1.item.Attributes["属性名"].value
        //2.item.Attributes.GetNamedItem("属性名").Value

        //通过迭代器遍历或者循环遍历XmlNodeList对象 可以获取到各个单个元素节点
        #endregion

        #region 练习题
        PlayerInfo playerInfo = new PlayerInfo();
        playerInfo.LoadData("PlayerInfo.xml");
        #endregion
    }
}
